package com.zcx.common.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.apache.commons.lang3.time.DateUtils;

import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;
import java.util.UUID;
public class JwtUtil {

    private String selfKey;

    // 构造函数，接收一个字符串作为密钥
    public JwtUtil(String selfKey) {
        this.selfKey = selfKey;
    }

    // 创建 JWT 的方法
    public String createJwt(Map<String, Object> data, Integer minute) {
        // 使用密钥创建 SecretKey 对象
        SecretKey secretKey = Keys.hmacShaKeyFor(selfKey.getBytes(StandardCharsets.UTF_8));

        // 使用 Jwts.builder() 创建 JWT，并设置签名算法为 HS256
        String jwt = Jwts.builder().signWith(secretKey, SignatureAlgorithm.HS256)
                // 设置 JWT 的过期时间为当前时间往后推 minute 分钟
                .setExpiration(DateUtils.addMinutes(new Date(), minute))
                // 设置 JWT 的签发时间为当前时间
                .setIssuedAt(new Date())
                // 生成一个 UUID 作为 JWT 的唯一标识，并转换成大写，去掉中间的连接符 -
                .setId(UUID.randomUUID().toString().replaceAll("-", "").toUpperCase())
                // 添加额外的数据到 JWT 的 payload 中
                .addClaims(data)
                // 压缩 JWT 并返回
                .compact();
        return jwt;
    }

    // 解析 JWT 的方法
    public Claims readJwt(String jwt) {
        // 使用密钥创建 SecretKey 对象
        SecretKey secretKey = Keys.hmacShaKeyFor(selfKey.getBytes(StandardCharsets.UTF_8));

        // 使用 Jwts.parserBuilder() 创建一个解析器，并设置签名密钥
        Claims body = Jwts.parserBuilder().setSigningKey(secretKey)
                // 构建解析器并解析 JWT
                .build().parseClaimsJws(jwt).getBody();
        return body;
    }
}

